package file

import (
	"bufio"
	"io"
	"os"
	"strings"
)

// 按行读取文件，每行由 consumer 消费。消费的行不包含换行符。
// 注意：如果文件中有很大的行，可能引发内存不足的 panic。
func ReadLine(name string, consumer func(line string)) error {
	if consumer == nil {
		return nil
	}
	return OpenThen(name, func(fd *os.File) error {
		br := bufio.NewReader(fd)
		var sb strings.Builder
		for {
			line, more, err := br.ReadLine()
			if err != nil {
				if err == io.EOF {
					return nil
				}
				return err
			}
			if more {
				sb.Write(line)
				continue
			}
			if sb.Len() > 0 {
				sb.Write(line)
				consumer(sb.String())
				sb.Reset()
			} else {
				consumer(string(line))
			}
		}
	})
}

// 读取文件并写入到指定目标
func ReadTo(name string, to io.Writer) error {
	return OpenThen(name, func(fd *os.File) error {
		_, err := io.Copy(to, fd)
		return err
	})
}

// 读取文件，返回字符串
func ReadToString(name string) (string, error) {
	sb := new(strings.Builder)
	if err := ReadTo(name, sb); err != nil {
		return "", err
	}
	return sb.String(), nil
}
